#pragma once
/**
 * @file logger.hpp
 * @author niehaoyang2024@163.com
 * @brief 封装spdlog的操作 ap
 * @version 0.1
 * @date 2024-09-19
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include <iostream>
#include <string>
#include <memory>

#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <fmt/core.h>

/**
 * @brief 全局的日志器
 * 
 */
std::shared_ptr<spdlog::logger> g_default_logger;

/**
 * @brief 初始化日志器选项
 * 
 * @param mode 如果mode为true为发布模式，否则是调试模式
 * @param filename 发布模式使用，调试模式不适用
 * @param level 发布模式使用，调试模式不适用
 */
void init_logger(bool mode, const std::string filename, int level)
{

    if(g_default_logger != nullptr) return;
    if(mode == false){
        g_default_logger = spdlog::stdout_color_mt("default-logger-debugger");
        // g_default_logger->set_level(spdlog::level::trace);
        // g_default_logger->flush_on(spdlog::level::trace);//只要触发日志直接触发写盘
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));//只要触发日志直接触发写盘
    }else {
        g_default_logger = spdlog::basic_logger_mt("default-logger-releaser",filename);
        g_default_logger->set_level(static_cast<spdlog::level::level_enum>(level));
        g_default_logger->flush_on(static_cast<spdlog::level::level_enum>(level));//只要触发日志直接触发写盘
    }
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l] %v");
    // g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l] [%30s:%-4#] %v");
}


/**
 * @brief 宏函数代理
 * 
 */
#define LOG_TRACE(format, ...) g_default_logger->trace("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) g_default_logger->debug("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) g_default_logger->info("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) g_default_logger->warn("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) g_default_logger->error("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) g_default_logger->critical("[{}:{}] " format, __FILE__, __LINE__, ##__VA_ARGS__)

